λ°°μΉ(batching)λ‘ React μ±λ₯μ μ΅μ ννμΈμ! μ΄ μ’ ν© κ°μ΄λλ Reactκ° μν μ λ°μ΄νΈλ₯Ό μ΅μ ννλ λ°©λ², λ€μν λ°°μΉ κΈ°μ , 볡μ‘ν μ ν리μΌμ΄μ μμ ν¨μ¨μ±μ κ·Ήλννλ μ λ΅μ νꡬν©λλ€.
React λ°°μΉ(Batching): κ³ μ±λ₯ μ ν리μΌμ΄μ μ μν μν μ λ°μ΄νΈ μ΅μ ν μ λ΅
μ¬μ©μ μΈν°νμ΄μ€ ꡬμΆμ μν κ°λ ₯ν μλ°μ€ν¬λ¦½νΈ λΌμ΄λΈλ¬λ¦¬μΈ Reactλ μ΅μ μ μ±λ₯μ μΆκ΅¬ν©λλ€. μ΄λ₯Ό μν΄ μ¬μ©νλ ν΅μ¬ λ©μ»€λμ¦ μ€ νλλ μν μ λ°μ΄νΈ μ²λ¦¬ λ°©μμ μ΅μ ννλ λ°°μΉ(batching)μ λλ€. React λ°°μΉλ₯Ό μ΄ν΄νλ κ²μ νΉν μ ν리μΌμ΄μ μ 볡μ‘μ±μ΄ μ¦κ°ν λ, κ³ μ±λ₯μ λ°μν μ ν리μΌμ΄μ μ ꡬμΆνλ λ° λ§€μ° μ€μν©λλ€. μ΄ μ’ ν© κ°μ΄λμμλ React λ°°μΉμ 볡μ‘ν μΈ‘λ©΄μ κΉμ΄ νκ³ λ€μ΄ κ·Έ μ΄μ , λ€μν μ λ΅, κ·Έλ¦¬κ³ ν¨κ³Όλ₯Ό κ·ΉλννκΈ° μν κ³ κΈ κΈ°μ λ€μ νꡬν©λλ€.
React λ°°μΉλ 무μμΈκ°?
React λ°°μΉλ μ¬λ¬ μν μ λ°μ΄νΈλ₯Ό νλμ 리λ λ(re-render)λ‘ κ·Έλ£Ήννλ κ³Όμ μ λλ€. Reactλ λͺ¨λ μν μ λ°μ΄νΈλ§λ€ μ»΄ν¬λνΈλ₯Ό 리λ λλ§νλ λμ , λͺ¨λ μ λ°μ΄νΈκ° μλ£λ λκΉμ§ κΈ°λ€λ Έλ€κ° λ¨μΌ λ λλ§μ μνν©λλ€. μ΄λ 리λ λ νμλ₯Ό νκΈ°μ μΌλ‘ μ€μ¬ μλΉν μ±λ₯ ν₯μμ κ°μ Έμ΅λλ€.
λμΌν μ΄λ²€νΈ νΈλ€λ¬ λ΄μμ μ¬λ¬ μν λ³μλ₯Ό μ λ°μ΄νΈν΄μΌ νλ μλ리μ€λ₯Ό μκ°ν΄ λ΄ μλ€:
function MyComponent() {
const [countA, setCountA] = React.useState(0);
const [countB, setCountB] = React.useState(0);
const handleClick = () => {
setCountA(countA + 1);
setCountB(countB + 1);
};
return (
<button onClick={handleClick}>
Increment Both
</button>
);
}
λ°°μΉκ° μλ€λ©΄ μ΄ μ½λλ setCountAμ λν 리λ λ ν λ², setCountBμ λν 리λ λ ν λ², μ΄ λ λ²μ 리λ λλ₯Ό μ λ°ν κ²μ
λλ€. νμ§λ§ React λ°°μΉλ μ΄λ¬ν μ
λ°μ΄νΈλ€μ μ§λ₯μ μΌλ‘ κ·Έλ£Ήννμ¬ λ¨μΌ 리λ λλ‘ μ²λ¦¬νλ―λ‘ λ λμ μ±λ₯μ 보μ¬μ€λλ€. μ΄λ νΉν λ 볡μ‘ν μ»΄ν¬λνΈμ μ¦μ μν λ³κ²½μ λ€λ£° λ λλλ¬μ§λλ€.
λ°°μΉμ μ΄μ
React λ°°μΉμ μ£Όλ μ΄μ μ μ±λ₯ ν₯μμ λλ€. 리λ λ νμλ₯Ό μ€μμΌλ‘μ¨ λΈλΌμ°μ κ° ν΄μΌ ν μμ μ μμ μ΅μννμ¬ λ λΆλλ½κ³ λ°μμ΄ λΉ λ₯Έ μ¬μ©μ κ²½νμ μ 곡ν©λλ€. ꡬ체μ μΌλ‘, λ°°μΉλ λ€μκ³Ό κ°μ μ₯μ μ μ 곡ν©λλ€:
- 리λ λ κ°μ: κ°μ₯ ν° μ΄μ μ 리λ λ νμμ κ°μμ λλ€. μ΄λ κ³§ CPU μ¬μ©λ κ°μμ λ λΉ λ₯Έ λ λλ§ μκ°μΌλ‘ μ΄μ΄μ§λλ€.
- λ°μμ± ν₯μ: 리λ λλ₯Ό μ΅μνν¨μΌλ‘μ¨ μ ν리μΌμ΄μ μ μ¬μ©μ μνΈμμ©μ λ λΉ λ₯΄κ² λ°μνκ² λ©λλ€. μ¬μ©μλ μ§μ°μ λ λλΌκ³ λ μ μ°ν μΈν°νμ΄μ€λ₯Ό κ²½νν©λλ€.
- μ±λ₯ μ΅μ ν: λ°°μΉλ μ ν리μΌμ΄μ μ μ λ°μ μΈ μ±λ₯μ μ΅μ ννμ¬, νΉν 리μμ€κ° μ νλ κΈ°κΈ°μμ λ λμ μ¬μ©μ κ²½νμ μ 곡ν©λλ€.
- μλμ§ μλΉ κ°μ: 리λ λ νμκ° μ€μ΄λ€λ©΄ μλμ§ μλΉλ κ°μνλλ°, μ΄λ λͺ¨λ°μΌ κΈ°κΈ°μ λ ΈνΈλΆμμ μ€μν κ³ λ € μ¬νμ λλ€.
React 18 μ΄μμ μλ λ°°μΉ
React 18 μ΄μ μλ λ°°μΉκ° μ£Όλ‘ React μ΄λ²€νΈ νΈλ€λ¬ λ΄μ μν μ
λ°μ΄νΈμλ§ κ΅νλμμ΅λλ€. μ¦, setTimeout, νλ‘λ―Έμ€(promise), λ€μ΄ν°λΈ μ΄λ²€νΈ νΈλ€λ¬ λ΄μ μν μ
λ°μ΄νΈμ κ°μ΄ μ΄λ²€νΈ νΈλ€λ¬ μΈλΆμμ λ°μνλ μ
λ°μ΄νΈλ λ°°μΉ μ²λ¦¬λμ§ μμμ΅λλ€. React 18μμλ μλ λ°°μΉλ₯Ό λμ
νμ¬, μ
λ°μ΄νΈκ° μ΄λμμ λ°μνλ κ±°μ λͺ¨λ μν μ
λ°μ΄νΈλ₯Ό ν¬ν¨νλλ‘ λ°°μΉλ₯Ό νμ₯νμ΅λλ€. μ΄ κ°μ μ¬νμ μ±λ₯ μ΅μ νλ₯Ό ν¬κ² λ¨μννκ³ μλ κ°μ
μ νμμ±μ μ€μ¬μ€λλ€.
μλ λ°°μΉλ₯Ό ν΅ν΄ λ€μ μ½λλ μ΄μ React 18μμ λ°°μΉ μ²λ¦¬λ©λλ€:
function MyComponent() {
const [countA, setCountA] = React.useState(0);
const [countB, setCountB] = React.useState(0);
const handleClick = () => {
setTimeout(() => {
setCountA(countA + 1);
setCountB(countB + 1);
}, 0);
};
return (
<button onClick={handleClick}>
Increment Both
</button>
);
}
μ΄ μμ μμ μν μ
λ°μ΄νΈκ° setTimeout μ½λ°± λ΄μ μμμλ λΆκ΅¬νκ³ React 18μ μ΄λ₯Ό λ¨μΌ 리λ λλ‘ λ°°μΉ μ²λ¦¬ν©λλ€. μ΄λ¬ν μλ λμμ μ±λ₯ μ΅μ νλ₯Ό λ¨μννκ³ λ€μν μ½λ ν¨ν΄μ κ±Έμ³ μΌκ΄λ λ°°μΉλ₯Ό 보μ₯ν©λλ€.
λ°°μΉκ° λ°μνμ§ μλ κ²½μ° (κ·Έλ¦¬κ³ λμ² λ°©λ²)
Reactμ μλ λ°°μΉ κΈ°λ₯μλ λΆκ΅¬νκ³ , λ°°μΉκ° μμλλ‘ λ°μνμ§ μλ μν©μ΄ μμ΅λλ€. μ΄λ¬ν μλ리μ€λ₯Ό μ΄ν΄νκ³ λμ² λ°©λ²μ μλ κ²μ μ΅μ μ μ±λ₯μ μ μ§νλ λ° μ€μν©λλ€.
1. React λ λ νΈλ¦¬ μΈλΆμ μ λ°μ΄νΈ
μν μ λ°μ΄νΈκ° Reactμ λ λ νΈλ¦¬ μΈλΆ(μ: DOMμ μ§μ μ‘°μνλ λΌμ΄λΈλ¬λ¦¬ λ΄)μμ λ°μνλ©΄ λ°°μΉκ° μλμΌλ‘ μ΄λ£¨μ΄μ§μ§ μμ΅λλ€. μ΄λ° κ²½μ°μλ μλμΌλ‘ 리λ λλ₯Ό νΈλ¦¬κ±°νκ±°λ Reactμ μ¬μ‘°μ (reconciliation) λ©μ»€λμ¦μ μ¬μ©νμ¬ μΌκ΄μ±μ 보μ₯ν΄μΌ ν μ μμ΅λλ€.
2. λ κ±°μ μ½λ λλ λΌμ΄λΈλ¬λ¦¬
μ€λλ μ½λλ² μ΄μ€λ μλνν° λΌμ΄λΈλ¬λ¦¬λ Reactμ λ°°μΉ λ©μ»€λμ¦μ λ°©ν΄νλ ν¨ν΄μ μμ‘΄ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, λΌμ΄λΈλ¬λ¦¬κ° λͺ μμ μΌλ‘ 리λ λλ₯Ό νΈλ¦¬κ±°νκ±°λ μ€λλ APIλ₯Ό μ¬μ©ν μ μμ΅λλ€. μ΄λ¬ν κ²½μ° μ½λλ₯Ό 리ν©ν λ§νκ±°λ Reactμ λ°°μΉ λμκ³Ό νΈνλλ λ체 λΌμ΄λΈλ¬λ¦¬λ₯Ό μ°ΎμμΌ ν μ μμ΅λλ€.
3. μ¦κ°μ μΈ λ λλ§μ΄ νμν κΈ΄κΈ μ λ°μ΄νΈ
λλ¬Έ κ²½μ°μ§λ§ νΉμ μν μ
λ°μ΄νΈμ λν΄ μ¦κ°μ μΈ λ¦¬λ λλ₯Ό κ°μ ν΄μΌ ν μλ μμ΅λλ€. μ΄λ μ
λ°μ΄νΈκ° μ¬μ©μ κ²½νμ μ€μνμ¬ μ§μ°λ μ μμ λ νμν μ μμ΅λλ€. Reactλ μ΄λ¬ν μν©μ μν΄ flushSync APIλ₯Ό μ 곡ν©λλ€(μλμμ μμΈν μ€λͺ
).
μν μ λ°μ΄νΈ μ΅μ ν μ λ΅
React λ°°μΉλ μλμ μΈ μ±λ₯ ν₯μμ μ 곡νμ§λ§, μν μ λ°μ΄νΈλ₯Ό μΆκ°λ‘ μ΅μ ννμ¬ ν¨μ¬ λ μ’μ κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€. λ€μμ λͺ κ°μ§ ν¨κ³Όμ μΈ μ λ΅μ λλ€:
1. κ΄λ ¨ μν μ λ°μ΄νΈ κ·Έλ£ΉννκΈ°
κ°λ₯ν λλ§λ€ κ΄λ ¨ μν μ λ°μ΄νΈλ₯Ό λ¨μΌ μ λ°μ΄νΈλ‘ κ·Έλ£ΉννμΈμ. μ΄λ 리λ λ νμλ₯Ό μ€μ΄κ³ μ±λ₯μ ν₯μμν΅λλ€. μλ₯Ό λ€μ΄, μ¬λ¬ κ°λ³ μν λ³μλ₯Ό μ λ°μ΄νΈνλ λμ , λͺ¨λ κ΄λ ¨ κ°μ ν¬ν¨νλ κ°μ²΄λ₯Ό κ°μ§ λ¨μΌ μν λ³μλ₯Ό μ¬μ©νλ κ²μ κ³ λ €ν΄ λ³΄μΈμ.
function MyComponent() {
const [data, setData] = React.useState({
name: '',
email: '',
age: 0,
});
const handleChange = (e) => {
const { name, value } = e.target;
setData({ ...data, [name]: value });
};
return (
<form>
<input type="text" name="name" value={data.name} onChange={handleChange} />
<input type="email" name="email" value={data.email} onChange={handleChange} />
<input type="number" name="age" value={data.age} onChange={handleChange} />
</form>
);
}
μ΄ μμ μμλ λͺ¨λ νΌ μ
λ ₯ λ³κ²½μ΄ data μν λ³μλ₯Ό μ
λ°μ΄νΈνλ λ¨μΌ handleChange ν¨μμ μν΄ μ²λ¦¬λ©λλ€. μ΄λ₯Ό ν΅ν΄ λͺ¨λ κ΄λ ¨ μν μ
λ°μ΄νΈκ° λ¨μΌ 리λ λλ‘ λ°°μΉ μ²λ¦¬λλλ‘ λ³΄μ₯ν©λλ€.
2. ν¨μν μ λ°μ΄νΈ μ¬μ©νκΈ°
μ΄μ κ°μ κΈ°λ°μΌλ‘ μνλ₯Ό μ λ°μ΄νΈν λλ ν¨μν μ λ°μ΄νΈλ₯Ό μ¬μ©νμΈμ. ν¨μν μ λ°μ΄νΈλ μ΄μ μν κ°μ μ λ°μ΄νΈ ν¨μμ μΈμλ‘ μ 곡νμ¬, λΉλκΈ°μ μΈ μλ리μ€μμλ νμ μ¬λ°λ₯Έ κ°μΌλ‘ μμ νλλ‘ λ³΄μ₯ν©λλ€.
function MyComponent() {
const [count, setCount] = React.useState(0);
const handleClick = () => {
setCount((prevCount) => prevCount + 1);
};
return (
<button onClick={handleClick}>
Increment
</button>
);
}
ν¨μν μ
λ°μ΄νΈ setCount((prevCount) => prevCount + 1)λ₯Ό μ¬μ©νλ©΄ μ¬λ¬ μ
λ°μ΄νΈκ° ν¨κ» λ°°μΉ μ²λ¦¬λλλΌλ μ
λ°μ΄νΈκ° μ¬λ°λ₯Έ μ΄μ κ°μ κΈ°λ°μΌλ‘ νλ€λ κ²μ 보μ₯ν©λλ€.
3. useCallbackκ³Ό useMemo νμ©νκΈ°
useCallbackκ³Ό useMemoλ React μ±λ₯ μ΅μ νλ₯Ό μν νμμ μΈ ν
μ
λλ€. μ΄λ€μ ν¨μμ κ°μ λ©λͺ¨μ΄μ μ΄μ
(memoize)νμ¬ μμ μ»΄ν¬λνΈμ λΆνμν 리λ λλ₯Ό λ°©μ§ν μ μκ² ν΄μ€λλ€. μ΄λ μ΄λ¬ν κ°μ μμ‘΄νλ μμ μ»΄ν¬λνΈμ propsλ₯Ό μ λ¬ν λ νΉν μ€μν©λλ€.
function MyComponent() {
const [count, setCount] = React.useState(0);
const increment = React.useCallback(() => {
setCount((prevCount) => prevCount + 1);
}, []);
return (
<ChildComponent increment={increment} />
);
}
function ChildComponent({ increment }) {
React.useEffect(() => {
console.log('ChildComponent rendered');
});
return (<button onClick={increment}>Increment</button>);
}
μ΄ μμ μμ useCallbackμ increment ν¨μλ₯Ό λ©λͺ¨μ΄μ μ΄μ
νμ¬, μμ‘΄μ±μ΄ λ³κ²½λ λλ§(μ΄ κ²½μ° μμ) ν¨μκ° λ³κ²½λλλ‘ λ³΄μ₯ν©λλ€. μ΄λ count μνκ° λ³κ²½λ λ ChildComponentκ° λΆνμνκ² λ¦¬λ λλ§λλ κ²μ λ°©μ§ν©λλ€.
4. λλ°μ΄μ±(Debouncing)κ³Ό μ€λ‘νλ§(Throttling)
λλ°μ΄μ±κ³Ό μ€λ‘νλ§μ ν¨μκ° μ€νλλ λΉλλ₯Ό μ ννλ κΈ°μ μ λλ€. μ€ν¬λ‘€ μ΄λ²€νΈλ μ λ ₯ λ³κ²½κ³Ό κ°μ΄ μ¦μ μ λ°μ΄νΈλ₯Ό μ λ°νλ μ΄λ²€νΈλ₯Ό μ²λ¦¬νλ λ° νΉν μ μ©ν©λλ€. λλ°μ΄μ±μ νΉμ κΈ°κ° λμ μλ¬΄λ° νλμ΄ μμ λλ§ ν¨μκ° μ€νλλλ‘ λ³΄μ₯νλ©°, μ€λ‘νλ§μ μ£Όμ΄μ§ μκ° κ°κ²© λ΄μ ν¨μκ° μ΅λ ν λ²λ§ μ€νλλλ‘ λ³΄μ₯ν©λλ€.
import { debounce } from 'lodash';
function MyComponent() {
const [searchTerm, setSearchTerm] = React.useState('');
const handleInputChange = (e) => {
const value = e.target.value;
setSearchTerm(value);
debouncedSearch(value);
};
const search = (term) => {
console.log('Searching for:', term);
// Perform search logic here
};
const debouncedSearch = React.useMemo(() => debounce(search, 300), []);
return (
<input type="text" onChange={handleInputChange} />
);
}
μ΄ μμ μμλ Lodashμ debounce ν¨μλ₯Ό μ¬μ©νμ¬ search ν¨μλ₯Ό λλ°μ΄μ±ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μκ° 300λ°λ¦¬μ΄ λμ νμ΄νμ λ©μΆ νμλ§ κ²μ ν¨μκ° μ€νλλλ‘ λ³΄μ₯νμ¬ λΆνμν API νΈμΆμ λ°©μ§νκ³ μ±λ₯μ ν₯μμν΅λλ€.
κ³ κΈ κΈ°μ : requestAnimationFrameκ³Ό flushSync
λ κ³ κΈ μλ리μ€λ₯Ό μν΄ Reactλ requestAnimationFrameκ³Ό flushSyncλΌλ λ κ°μ§ κ°λ ₯ν APIλ₯Ό μ 곡ν©λλ€. μ΄λ¬ν APIλ₯Ό μ¬μ©νλ©΄ μν μ
λ°μ΄νΈμ νμ΄λ°μ λ―ΈμΈ μ‘°μ νκ³ λ¦¬λ λκ° λ°μνλ μμ μ μ μ΄ν μ μμ΅λλ€.
1. requestAnimationFrame
requestAnimationFrameμ λ€μ 리νμΈνΈ(repaint)κ° μΌμ΄λκΈ° μ μ ν¨μ μ€νμ μμ½νλ λΈλΌμ°μ APIμ
λλ€. μ£Όλ‘ μ λλ©μ΄μ
λ° κΈ°ν μκ°μ μ
λ°μ΄νΈλ₯Ό λΆλλ½κ³ ν¨μ¨μ μΈ λ°©μμΌλ‘ μννλ λ° μ¬μ©λ©λλ€. Reactμμλ requestAnimationFrameμ μ¬μ©νμ¬ μν μ
λ°μ΄νΈλ₯Ό λ°°μΉ μ²λ¦¬νκ³ λΈλΌμ°μ μ λ λλ§ μ£ΌκΈ°μ λκΈ°νλλλ‘ ν μ μμ΅λλ€.
function MyComponent() {
const [position, setPosition] = React.useState(0);
React.useEffect(() => {
const animate = () => {
requestAnimationFrame(() => {
setPosition((prevPosition) => prevPosition + 1);
animate();
});
};
animate();
}, []);
return (
<div style={{ transform: `translateX(${position}px)` }}>
Moving Element
</div>
);
}
μ΄ μμ μμλ requestAnimationFrameμ μ¬μ©νμ¬ position μν λ³μλ₯Ό μ§μμ μΌλ‘ μ
λ°μ΄νΈνμ¬ λΆλλ¬μ΄ μ λλ©μ΄μ
μ λ§λλλ€. requestAnimationFrameμ μ¬μ©νλ©΄ μ
λ°μ΄νΈκ° λΈλΌμ°μ μ λ λλ§ μ£ΌκΈ°μ λκΈ°νλμ΄, λ²λ²
거리λ(janky) μ λλ©μ΄μ
μ λ°©μ§νκ³ μ΅μ μ μ±λ₯μ 보μ₯ν©λλ€.
2. flushSync
flushSyncλ DOMμ λν μ¦κ°μ μΈ λκΈ°μ μ
λ°μ΄νΈλ₯Ό κ°μ νλ React APIμ
λλ€. μΌλ°μ μΌλ‘ μΈλΆ λΌμ΄λΈλ¬λ¦¬μ μνΈ μμ©νκ±°λ μ€μν UI μ
λ°μ΄νΈλ₯Ό μνν λμ κ°μ΄ μν μ
λ°μ΄νΈκ° UIμ μ¦μ λ°μλμ΄μΌ νλ λλ¬Έ κ²½μ°μ μ¬μ©λ©λλ€. λ°°μΉμ μ±λ₯ μ΄μ μ 무ν¨νν μ μμΌλ―λ‘ μκ»΄μ μ¬μ©ν΄μΌ ν©λλ€.
import { flushSync } from 'react-dom';
function MyComponent() {
const [text, setText] = React.useState('');
const handleChange = (e) => {
const value = e.target.value;
flushSync(() => {
setText(value);
});
// Perform other synchronous operations that rely on the updated text
console.log('Text updated synchronously:', value);
};
return (
<input type="text" onChange={handleChange} />
);
}
μ΄ μμ μμλ flushSyncλ₯Ό μ¬μ©νμ¬ μ
λ ₯μ΄ λ³κ²½λ λλ§λ€ text μν λ³μλ₯Ό μ¦μ μ
λ°μ΄νΈν©λλ€. μ΄λ₯Ό ν΅ν΄ μ
λ°μ΄νΈλ ν
μ€νΈμ μμ‘΄νλ λͺ¨λ νμ λκΈ° μμ
μ΄ μ¬λ°λ₯Έ κ°μ μ κ·Όν μ μλλ‘ λ³΄μ₯ν©λλ€. flushSyncλ Reactμ λ°°μΉ λ©μ»€λμ¦μ λ°©ν΄νκ³ κ³Όλνκ² μ¬μ©νλ©΄ μ μ¬μ μΌλ‘ μ±λ₯ λ¬Έμ λ₯Ό μΌμΌν¬ μ μμΌλ―λ‘ μ μ€νκ² μ¬μ©νλ κ²μ΄ μ€μν©λλ€.
μ€μ μ μ© μ¬λ‘: κΈλ‘λ² μ΄μ»€λ¨Έμ€μ κΈμ΅ λμ보λ
React λ°°μΉμ μ΅μ ν μ λ΅μ μ€μμ±μ μ€λͺ νκΈ° μν΄ λ κ°μ§ μ€μ μ¬λ‘λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
1. κΈλ‘λ² μ΄μ»€λ¨Έμ€ νλ«νΌ
κΈλ‘λ² μ΄μ»€λ¨Έμ€ νλ«νΌμ μν νμ, μ₯λ°κ΅¬λ λ΄κΈ°, ꡬ맀 μλ£ λ± λλμ μ¬μ©μ μνΈμμ©μ μ²λ¦¬ν©λλ€. μ μ ν μ΅μ νκ° μμΌλ©΄ μ₯λ°κ΅¬λ μ΄μ‘, μν μ¬κ³ , λ°°μ‘λΉμ κ΄λ ¨λ μν μ λ°μ΄νΈκ° μλ§μ 리λ λλ₯Ό μ λ°νμ¬, νΉν μ ν₯ μμ₯μ μΈν°λ· μ°κ²°μ΄ λλ¦° μ¬μ©μμκ²λ λλ¦° μ¬μ©μ κ²½νμ μ΄λν μ μμ΅λλ€. React λ°°μΉμ κ²μμ΄ λλ°μ΄μ±, μ₯λ°κ΅¬λ μ΄μ‘ μ λ°μ΄νΈ μ€λ‘νλ§κ³Ό κ°μ κΈ°μ μ ꡬνν¨μΌλ‘μ¨ νλ«νΌμ μ±λ₯κ³Ό λ°μμ±μ ν¬κ² ν₯μμμΌ μ μΈκ³ μ¬μ©μμκ² μνν μΌν κ²½νμ 보μ₯ν μ μμ΅λλ€.
2. κΈμ΅ λμ보λ
κΈμ΅ λμ보λλ μ€μκ° μμ₯ λ°μ΄ν°, ν¬νΈν΄λ¦¬μ€ μ±κ³Ό λ° κ±°λ λ΄μμ νμν©λλ€. λμ보λλ μ΅μ μμ₯ μν©μ λ°μνκΈ° μν΄ μμ£Ό μ
λ°μ΄νΈλμ΄μΌ ν©λλ€. κ·Έλ¬λ κ³Όλν 리λ λλ λ²λ²
κ±°λ¦¬κ³ λ°μμ΄ μλ μΈν°νμ΄μ€λ‘ μ΄μ΄μ§ μ μμ΅λλ€. λΉμ©μ΄ λ§μ΄ λλ κ³μ°μ λ©λͺ¨μ΄μ μ΄μ
νκΈ° μν useMemoμ λΈλΌμ°μ μ λ λλ§ μ£ΌκΈ°μ μ
λ°μ΄νΈλ₯Ό λκΈ°ννκΈ° μν requestAnimationFrameκ³Ό κ°μ κΈ°μ μ νμ©ν¨μΌλ‘μ¨ λμ보λλ λΉλ²ν λ°μ΄ν° μ
λ°μ΄νΈμλ λΆκ΅¬νκ³ λΆλλ½κ³ μ μ°ν μ¬μ©μ κ²½νμ μ μ§ν μ μμ΅λλ€. λν, κΈμ΅ λ°μ΄ν° μ€νΈλ¦¬λ°μ μμ£Ό μ¬μ©λλ μλ² μ μ‘ μ΄λ²€νΈ(SSE)λ React 18μ μλ λ°°μΉ κΈ°λ₯μ ν° μ΄μ μ μ»μ΅λλ€. SSEλ₯Ό ν΅ν΄ μμ λ μ
λ°μ΄νΈλ μλμΌλ‘ λ°°μΉ μ²λ¦¬λμ΄ λΆνμν 리λ λλ₯Ό λ°©μ§ν©λλ€.
κ²°λ‘
React λ°°μΉλ μ ν리μΌμ΄μ
μ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μλ κΈ°λ³Έμ μΈ μ΅μ ν κΈ°μ μ
λλ€. λ°°μΉμ μλ λ°©μμ μ΄ν΄νκ³ ν¨κ³Όμ μΈ μ΅μ ν μ λ΅μ ꡬνν¨μΌλ‘μ¨, μ ν리μΌμ΄μ
μ 볡μ‘μ±μ΄λ μ¬μ©μμ μμΉμ κ΄κ³μμ΄ νλ₯ν μ¬μ©μ κ²½νμ μ 곡νλ κ³ μ±λ₯μ λ°μν μ¬μ©μ μΈν°νμ΄μ€λ₯Ό ꡬμΆν μ μμ΅λλ€. React 18μ μλ λ°°μΉλΆν° requestAnimationFrame, flushSyncμ κ°μ κ³ κΈ κΈ°μ μ μ΄λ₯΄κΈ°κΉμ§ Reactλ μν μ
λ°μ΄νΈλ₯Ό λ―ΈμΈ μ‘°μ νκ³ μ±λ₯μ κ·ΉλννκΈ° μν νλΆν λꡬ λͺ¨μμ μ 곡ν©λλ€. React μ ν리μΌμ΄μ
μ μ§μμ μΌλ‘ λͺ¨λν°λ§νκ³ μ΅μ νν¨μΌλ‘μ¨ μ μΈκ³ μ¬μ©μλ€μ΄ λΉ λ₯΄κ³ λ°μμ΄ μ’μΌλ©° μ¦κ²κ² μ¬μ©ν μ μλλ‘ λ³΄μ₯ν μ μμ΅λλ€.